package edu.corn.job.core.engine.mutex;

import edu.corn.job.core.context.JobRunningContext;
import edu.corn.job.core.processor.MutexProcessor;

/**
 * 互斥量锁池。
 * 获取锁时，未获取到将job挂起。
 * 释放锁时，通知job尝试执行。
 */
public interface MutexPool {

    /**
     * 能够根据传入的job，完成加锁的功能。
     *
     * @param processor
     * @return
     */
    Boolean lock(MutexProcessor processor);

    /**
     * 根据传入的job解锁。
     *
     * @param processor
     */
    void unlock(MutexProcessor processor);


    /**
     * 根据传入的job，锁对应的时间，默认是秒。
     *
     * @param processor
     * @param timeout
     * @return
     */
    Boolean lock(MutexProcessor processor, long timeout);

    /**
     * 更自由的锁。
     *
     * @param context
     * @return
     */
    Boolean lock(JobRunningContext context);

    /**
     * 根据字符串锁。
     *
     * @param key
     * @return
     */
    Boolean lock(String key);


    /**
     * 根据字符串锁。
     * @param key
     * @param timeout 默认为秒。
     * @return
     */
    Boolean lock(String key, long timeout);

}
